package cn.tedu.tickets;/**
 * @Author 金帮嘉诚 @Date 2021-06-23 星期三 10:02
 */
/*需求：设计多线程编程模型，4个售票窗口共计售卖100张票*/
/*本类通过继承Thread类的方式完成多线程编程案例*/

/**
 * 知识点
 */
public class TestThread {
    public static void main(String[] args) {
        //继承Thread类，需要创建多个继承了Thread类的类的对象
        MyThread my1 = new MyThread();
        MyThread my2 = new MyThread();
        MyThread my3 = new MyThread();
        MyThread my4 = new MyThread();

        my1.start();
        my2.start();
        my3.start();
        my4.start();

        //用Runnable接口，只需创建一个实现了该接口的类的对象，再用该对象创建多个线程
//        MyThread2 my21 = new MyThread2();
//
//        Thread t1 = new Thread(my21);
//        Thread t2 = new Thread(my21);
//        Thread t3 = new Thread(my21);
//        Thread t4 = new Thread(my21);
//
//        t1.start();
//        t2.start();
//        t3.start();
//        t4.start();


    }
}


//class MyThread2 implements Runnable {
//    static int ticketNumber = 100;
//
//    @Override
//    public void run() {
//        try {
//            Thread.sleep(10);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        while (ticketNumber > 0) {
//            if (ticketNumber <= 0) break;
//            System.out.println("还剩" + (ticketNumber--) + "张，售出一张");
//        }
//        System.out.println("抱歉！票已售完！");
//    }
//}

class MyThread extends Thread {
    static int ticketNumber = 100;/*静态资源属于类资源，被全局所有对象共享，只有一份*/

    @Override
    public void run() {
        while (true) {
            try {
                //8.让程序休眠十毫秒
                /*我们可以人为的让程序休眠十毫秒，为的是增加线程状态切换的概率
                问题1：产生了重卖现象：同一张票卖给了两个人
                问题2：产生了超卖现象：票数出现了0，-1，-2，超出了实际票数
                * */
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("还剩" + (ticketNumber--) + "张票，售出一张");
            if (ticketNumber <= 0) break;
        }
        System.out.println("抱歉！票已售完！");
    }
}
